package com.example.springbooti18.service;

import com.example.springbooti18.entity.Message;
import com.example.springbooti18.repository.MessageRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.support.AbstractMessageSource;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import java.text.MessageFormat;
import java.util.Locale;
import java.util.Optional;

/**
 * 自定义的数据库消息源
 * 继承AbstractMessageSource，从数据库中获取国际化消息
 */
@Component("messageSource")
public class DatabaseMessageSource extends AbstractMessageSource {

    @Autowired
    private MessageRepository messageRepository;

    /**
     * 从数据库中获取消息
     * 这是AbstractMessageSource中唯一需要实现的抽象方法
     */
    @Override
    protected MessageFormat resolveCode(String code, Locale locale) {
        // 获取语言代码，例如zh_CN, en_US
        String languageCode = locale.toString();
        
        // 尝试从数据库中查找消息
        Optional<Message> messageOptional = messageRepository.findByKeyAndLanguageCode(code, languageCode);
        
        // 如果找不到，尝试使用语言代码的第一部分（如zh代替zh_CN）
        if (!messageOptional.isPresent()) {
            String baseLanguageCode = locale.getLanguage();
            messageOptional = messageRepository.findByKeyAndLanguageCode(code, baseLanguageCode);
        }
        
        // 如果还是找不到，返回null，这会触发父类的默认消息处理
        if (!messageOptional.isPresent()) {
            return null;
        }
        
        // 创建MessageFormat对象并返回
        Message message = messageOptional.get();
        String messageValue = message.getValue();
        if (StringUtils.hasText(messageValue)) {
            return createMessageFormat(messageValue, locale);
        }
        
        return null;
    }
}